package com.jia.lidao;

import android.app.Application;
import android.content.Context;
import android.content.Intent;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.jia.lidao.network.http.BusinessManager;
import com.jia.lidao.ui.login.LoginActivity;
import com.jia.lidao.utils.ImgLoaderUtil;
import com.jia.lidao.utils.LogUtil;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.decode.BaseImageDecoder;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

import java.text.SimpleDateFormat;
import java.util.Date;

import cn.jpush.android.api.CustomPushNotificationBuilder;
import cn.jpush.android.api.JPushInterface;


/**
 * application
 * 
 * Created by czhang on 17/12/15.
 */
public class App extends Application {

    public static App instance;

    public static IWXAPI api;

    @Override
    public void onCreate() {
        super.onCreate();
        instance=this;
        // 网络框架初始化
        api = WXAPIFactory.createWXAPI(this, Constans.APP_ID, true);
        api.registerApp(Constans.APP_ID);
        BusinessManager.getInstance().init(this);
        UserUtils.getInstance().init(this);
        initImageLoader(this);
        // 初始化极光推送 jpush_import
        initJpush();
        initLocation();
    }



    /**
     * 初始化ImageLoader
     */
    private void initImageLoader(Context context) {
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                context)
                // .memoryCacheExtraOptions(1280, 1920) // default =
                // device screen dimensions
                // .diskCacheExtraOptions(1280, 1920, null)
                .threadPoolSize(3)
                // default
                .threadPriority(Thread.NORM_PRIORITY - 2)
                // default
                .tasksProcessingOrder(QueueProcessingType.FIFO)
                // default ，不需要多个尺寸大小在内存中
                // .denyCacheImageMultipleSizesInMemory()
                /**
                 * UIL中的内存缓存策略 1. 只使用的是强引用缓存
                 * LruMemoryCache（这个类就是这个开源框架默认的内存缓存类，缓存的是bitmap的强引用
                 * ，下面我会从源码上面分析这个类） 2.使用强引用和弱引用相结合的缓存有
                 * UsingFreqLimitedMemoryCache（如果缓存的图片总量超过限定值，
                 * 先删除使用频率最小的bitmap） LRULimitedMemoryCache
                 * （这个也是使用的lru算法，和LruMemoryCache不同的是，他缓存的是bitmap的弱引用）
                 * FIFOLimitedMemoryCache（先进先出的缓存策略，当超过设定值，
                 * 先删除最先加入缓存的bitmap）
                 * LargestLimitedMemoryCache(当超过缓存限定值，先删除最大的bitmap对象)
                 * LimitedAgeMemoryCache（当 bitmap加入缓存中的时间超过我们设定的值，将其删除）
                 * 3.只使用弱引用缓存
                 * WeakMemoryCache（这个类缓存bitmap的总大小没有限制，唯一不足的地方就是不稳定，
                 * 缓存的图片容易被回收掉）
                 */
                .memoryCache(new UsingFreqLimitedMemoryCache(
                        8 * 1024 * 1024))
                // 限制内存大小
                .memoryCacheSize(8 * 1024 * 1024)
                .memoryCacheSizePercentage(10)
                // default
                // .diskCache(new UnlimitedDiscCache(cacheDir)) //
                // default
                .diskCacheSize(50 * 1024 * 1024).diskCacheFileCount(100)
                .diskCacheFileNameGenerator(
                        new HashCodeFileNameGenerator()) // default
                .imageDownloader(new BaseImageDownloader(context)) // default
                .imageDecoder(new BaseImageDecoder(true)) // default
                .defaultDisplayImageOptions(
                        DisplayImageOptions.createSimple()) // default
                .build();

        // 初始化imageLoader
        ImageLoader.getInstance().init(config);
    }


    /**
     * 初始化极光推送
     */
    private void initJpush() {
        JPushInterface.init(this);
        JPushInterface.setDebugMode(false);
        CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(this,R.layout.view_jpush,R.id.jpush_icon,R.id.jpush_title,R.id.jpush_content);
        builder.statusBarDrawable = R.mipmap.applogo;
        builder.layoutIconDrawable = R.mipmap.applogo;
        JPushInterface.setDefaultPushNotificationBuilder(builder);
    }



    //声明mlocationClient对象
    public AMapLocationClient mlocationClient;
    //声明mLocationOption对象
    public AMapLocationClientOption mLocationOption = null;


    private void initLocation(){
        mlocationClient = new AMapLocationClient(this);
//初始化定位参数
        mLocationOption = new AMapLocationClientOption();
//设置定位监听
        mlocationClient.setLocationListener(new AMapLocationListener() {
            @Override
            public void onLocationChanged(AMapLocation amapLocation) {
                if (amapLocation != null) {
                    if (amapLocation.getErrorCode() == 0) {
                        //定位成功回调信息，设置相关消息
                        amapLocation.getLocationType();//获取当前定位结果来源，如网络定位结果，详见定位类型表
                        amapLocation.getLatitude();//获取纬度
                        amapLocation.getLongitude();//获取经度
                        amapLocation.getAccuracy();//获取精度信息
                        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        Date date = new Date(amapLocation.getTime());
                        df.format(date);//定位时间
                        RunningContext.mLatitude=amapLocation.getLatitude();
                        RunningContext.mLongitude=amapLocation.getLongitude();
                    } else {
                        //显示错误信息ErrCode是错误码，errInfo是错误信息，详见错误码表。
                        LogUtil.printJ("location Error, ErrCode:"
                                + amapLocation.getErrorCode() + ", errInfo:"
                                + amapLocation.getErrorInfo());
                    }
                }
            }
        });
//设置定位模式为高精度模式，Battery_Saving为低功耗模式，Device_Sensors是仅设备模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms
        mLocationOption.setInterval(2000);
//设置定位参数
        mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求，为了减少电量消耗或网络流量消耗，
// 注意设置合适的定位时间的间隔（最小间隔支持为1000ms），并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后，在合适的生命周期调用onDestroy()方法
// 在单次定位情况下，定位无论成功与否，都无需调用stopLocation()方法移除请求，定位sdk内部会移除
//启动定位
        mlocationClient.startLocation();
    }


}
